package edu.northwestern.cbits.purple_robot_manager; import java.io.IOException; import java.util.HashMap; import java.util.Locale; import java.util.Map; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; import android.app.Application; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.net.Uri; import android.preference.PreferenceManager; // import com.squareup.leakcanary.LeakCanary; import edu.northwestern.cbits.purple_robot_manager.activities.settings.SettingsKeys; import edu.northwestern.cbits.purple_robot_manager.logging.LogManager; import edu.northwestern.cbits.xsi.XSI; public class PurpleRobotApplication extends Application { private static Context _context; private static long _lastFix = 0; @Override public void onCreate() { super.onCreate(); PurpleRobotApplication._context = this.getApplicationContext(); try { PackageInfo info = PurpleRobotApplication._context.getPackageManager().getPackageInfo(PurpleRobotApplication._context.getPackageName(), 0); System.setProperty("http.agent", "Purple Robot " + info.versionName); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } try { PackageInfo info = PurpleRobotApplication._context.getPackageManager().getPackageInfo(PurpleRobotApplication._context.getPackageName(), 0); XSI.setUserAgent(PurpleRobotApplication._context.getString(R.string.app_name) + " " + info.versionName); } catch (PackageManager.NameNotFoundException e) { LogManager.getInstance(PurpleRobotApplication._context).logException(e); } // LeakCanary.install(this); } public static Context getAppContext() { return PurpleRobotApplication._context; } public static boolean updateFromMap(Context context, Map<String, Object> config) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()); Editor e = prefs.edit(); for (String key : config.keySet()) { Object value = config.get(key); if (value instanceof String) { if (SettingsKeys.CONFIG_URL.equals(key)) EncryptionManager.getInstance().setConfigUri(context, Uri.parse(value.toString())); else if (SettingsKeys.USER_ID_KEY.equals(key)) EncryptionManager.getInstance().setUserId(context, value.toString()); else e.putString(key, value.toString()); } else if (value instanceof Boolean) e.putBoolean(key, (Boolean) value); } boolean success = e.commit(); return success; } public static Map<String, Object> configuration(Context context) { Map<String, Object> map = new HashMap<>(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(false); XmlPullParser xpp = context.getResources().getXml(R.xml.settings); int eventType = xpp.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { if (eventType == XmlPullParser.START_TAG) { String name = xpp.getName(); String key = xpp.getAttributeValue("http://schemas.android.com/apk/res/android", "key"); if (prefs.contains(key)) { if ("EditTextPreference".equals(name) || "edu.northwestern.cbits.purple_robot_manager.activities.settings.FlexibleEditTextPreference".equals(name)) map.put(key, prefs.getString(key, null)); else if ("ListPreference".equals(name) || "edu.northwestern.cbits.purple_robot_manager.activities.settings.FlexibleListPreference".equals(name)) map.put(key, prefs.getString(key, null)); else if ("CheckBoxPreference".equals(name)) { try { map.put(key, prefs.getBoolean(key, false)); } catch (ClassCastException e) { String value = prefs.getString(key, null); if (value != null && "true".equals(value.toLowerCase(Locale.ENGLISH))) map.put(key, true); else map.put(key, false); } } else if ("Preference".equals(name)) map.put(key, prefs.getString(key, null)); } } eventType = xpp.next(); } } catch (XmlPullParserException | IOException e) { LogManager.getInstance(context).logException(e); } map.put("config_probes_enabled", prefs.getBoolean("config_probes_enabled", false)); return map; } public static void fixPreferences(Context context, boolean force) { if (force) PurpleRobotApplication._lastFix = 0; long now = System.currentTimeMillis(); if (now - PurpleRobotApplication._lastFix > 60000) { Map<String, Object> values = PurpleRobotApplication.configuration(context); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); Editor e = prefs.edit(); for (String key : values.keySet()) { Object value = values.get(key); if (value instanceof Boolean) { Boolean boolValue = (Boolean) value; e.putBoolean(key, boolValue); } } e.commit(); PurpleRobotApplication._lastFix = now; } } }